/*
 * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: Unlicense OR CC0-1.0
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "esp_vfs.h"
#include "esp_vfs_fat.h"
#include "sdkconfig.h"
#include "dirent.h"

static const char *TAG = "file_checker"; // 日志标签

// 分区挂载路径
const char *base_path = "/spiflash";

// 磨损均衡库实例的句柄
static wl_handle_t s_wl_handle = WL_INVALID_HANDLE;

/**
 * @brief 递归列出目录中的所有文件和子目录
 * @param path 要列出的目录路径
 * @param level 递归层级（用于缩进显示）
 */
void list_files_recursive(const char *path, int level)
{
    DIR *dir = opendir(path);
    if (dir == NULL) {
        ESP_LOGE(TAG, "无法打开目录: %s", path);
        return;
    }

    // 缩进空格，用于美化显示层次结构
    char indent[64] = {0};
    for (int i = 0; i < level; i++) {
        strcat(indent, "  ");
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        // 跳过 . 和 .. 目录
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }
        
        // 构建完整路径
        // 替换原代码第51行附近的路径拼接逻辑如下：

        char full_path[256];
        int written = snprintf(full_path, sizeof(full_path), "%s/%s", path, entry->d_name);
        if (written < 0 || written >= sizeof(full_path)) {
            ESP_LOGE(TAG, "路径过长，无法完整构建: %s/%s", path, entry->d_name);
            continue;
        }
        
        // 判断是文件还是目录
        if (entry->d_type == DT_DIR) {
            ESP_LOGI(TAG, "%s[目录] %s", indent, full_path);
            // 递归列出子目录
            list_files_recursive(full_path, level + 1);
        } else {
            ESP_LOGI(TAG, "%s[文件] %s", indent, full_path);
        }
    }
    closedir(dir);
}

void app_main(void)
{
    ESP_LOGI(TAG, "文件系统检查工具启动");
    
    // 配置FAT文件系统挂载参数
    const esp_vfs_fat_mount_config_t mount_config = {
            .max_files = 4,             // 同时可打开的最大文件数
            .format_if_mount_failed = false, // 不自动格式化分区
            .allocation_unit_size = CONFIG_WL_SECTOR_SIZE,
            .use_one_fat = false
    };

    // 挂载FATFS文件系统
    ESP_LOGI(TAG, "正在挂载FAT文件系统，分区名称: 'storage', 挂载路径: %s", base_path);
    esp_err_t err = esp_vfs_fat_spiflash_mount_rw_wl(base_path, "storage", &mount_config, &s_wl_handle);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "挂载FATFS失败 (%s)", esp_err_to_name(err));
        if (err == ESP_FAIL) {
            ESP_LOGE(TAG, "提示: 分区可能未格式化。如需格式化，请将 format_if_mount_failed 设为 true");
        }
        return;
    }

    ESP_LOGI(TAG, "文件系统挂载成功");

    // 递归列出文件系统中的所有文件和目录
    ESP_LOGI(TAG, "开始列出文件系统中的所有文件和目录：");
    list_files_recursive(base_path, 0);

    // 卸载FAT文件系统
    ESP_LOGI(TAG, "卸载FAT文件系统");
    ESP_ERROR_CHECK(esp_vfs_fat_spiflash_unmount_rw_wl(base_path, s_wl_handle));
    
    ESP_LOGI(TAG, "文件系统检查完成");
}
